CTmax Data
temp_lat_plot = ctmax_data %>%
select(lat, collection_temp) %>%
distinct() %>%
ggplot(aes(x = lat, y = collection_temp)) +
geom_smooth(method = "lm", colour = "black") +
geom_point(size = 3) +
labs(x = "Latitude",
y = "Collection Temp. (°C)") +
theme_matt() +
theme(legend.position = "right")
ctmax_temp_plot = ctmax_data %>%
mutate(species = str_replace(species, "_", " "),
species = str_to_sentence(species)) %>%
ggplot(aes(x = collection_temp, y = ctmax)) +
geom_smooth(method = "lm", colour = "black") +
geom_point(aes(colour = species),
size = 3) +
labs(x = "Collection Temp. (°C)",
y = "CTmax (°C)") +
scale_colour_manual(values = skisto_cols) +
theme_matt() +
theme(legend.position = "right")
ctmax_lat_plot = ctmax_data %>%
mutate(species = str_replace(species, "_", " "),
species = str_to_sentence(species)) %>%
ggplot(aes(x = lat, y = ctmax)) +
geom_smooth(method = "lm", colour = "black") +
geom_point(aes(colour = species),
size = 3) +
labs(x = "Latitude",
y = "CTmax (°C)") +
scale_colour_manual(values = skisto_cols) +
theme_matt() +
theme(legend.position = "right")
ctmax_elev_plot = ctmax_data %>%
mutate(species = str_replace(species, "_", " "),
species = str_to_sentence(species)) %>%
ggplot(aes(x = elevation, y = ctmax)) +
geom_smooth(method = "lm", colour = "black") +
geom_point(aes(colour = species),
size = 3) +
labs(x = "Elevation (m)",
y = "CTmax (°C)") +
scale_colour_manual(values = skisto_cols) +
theme_matt() +
theme(legend.position = "right")
ggpubr::ggarrange(temp_lat_plot, ctmax_temp_plot, ctmax_lat_plot, ctmax_elev_plot, common.legend = T, legend = "right", nrow = 2, ncol = 2, labels = "AUTO")

ctmax_data %>%
mutate(species = str_replace(species, "_", " "),
species = str_to_sentence(species)) %>%
ggplot(aes(x = collection_temp, y = ctmax, colour = species)) +
facet_wrap(species~.) +
geom_smooth(method = "lm", colour = "black") +
geom_point() +
labs(x = "Collection Temp. (°C)",
y = "CTmax (°C)") +
scale_color_manual(values = skisto_cols) +
theme_matt() +
theme(legend.position = "none")

ctmax_data %>%
filter(str_detect(species, pattern = "skisto") |
str_detect(species, pattern = "lepto") |
str_detect(species, pattern = "aglao")) %>%
mutate(species = str_replace(species, "_", " "),
species = str_to_sentence(species)) %>%
group_by(collection_date, species, collection_temp) %>%
summarise(mean_ctmax = mean(ctmax),
ctmax_sd = sd(ctmax),
ctmax_n = n(),
ctmax_se = ctmax_sd / sqrt(ctmax_n)) %>%
ggplot(aes(x = collection_temp, y = mean_ctmax, colour = species)) +
geom_smooth(method = "lm", se=F, linewidth = 2) +
geom_point(size = 2) +
geom_errorbar(aes(ymin = mean_ctmax - ctmax_se,
ymax = mean_ctmax + ctmax_se),
width = 0.3, linewidth = 1) +
labs(x = "Collection Temp. (°C)",
y = "CTmax (°C)") +
scale_colour_manual(values = skisto_cols) +
theme_matt() +
theme(legend.position = "right")

ctmax_data %>%
mutate(species = str_replace(species, "_", " "),
species = str_to_sentence(species)) %>%
ggplot(aes(x = collection_temp, y = size, colour = species)) +
facet_wrap(species~.) +
geom_smooth(method = "lm", colour = "black") +
geom_point() +
labs(x = "Collection Temp. (°C)",
y = "Prosome Length (mm)") +
scale_color_manual(values = skisto_cols) +
theme_matt() +
theme(legend.position = "none")

ctmax_data %>%
mutate(species = str_replace(species, "_", " "),
species = str_to_sentence(species)) %>%
ggplot(aes(x = collection_temp, y = egg_volume, colour = species)) +
facet_wrap(species~.) +
geom_smooth(method = "lm", colour = "black") +
geom_point() +
labs(x = "Collection Temp. (°C)",
y = "Egg Volume (mm^3)") +
scale_color_manual(values = skisto_cols) +
theme_matt() +
theme(legend.position = "none")

ctmax_data %>%
select(elevation, collection_temp) %>%
distinct() %>%
ggplot(aes(x = elevation, y = collection_temp)) +
geom_point(size = 3) +
labs(x = "Elevation (m)",
y = "Collection Temp. (°C)") +
theme_matt()

ctmax_data %>%
mutate(species = str_replace(species, "_", " "),
species = str_to_sentence(species)) %>%
ggplot(aes(x = size, y = ctmax, colour = species)) +
#facet_wrap(.~species) +
geom_point(size = 1) +
theme_matt() +
labs(x = "Length (mm)",
y = "CTmax (°C)") +
scale_colour_manual(values = skisto_cols) +
theme(legend.position = "none")

ctmax_data %>%
mutate(species = str_replace(species, "_", " "),
species = str_to_sentence(species)) %>%
ggplot(aes(x = size, y = fecundity, colour = species)) +
facet_wrap(.~species) +
geom_point(size = 1) +
theme_matt() +
labs(x = "Length (mm)",
y = "Fecundity (# eggs)") +
scale_colour_manual(values = skisto_cols) +
theme(legend.position = "none")

ggplot(ctmax_data, aes(x = size, y = total_egg_volume)) +
geom_smooth(method = "lm", formula = y ~ exp(x)) +
geom_point()+
labs(x = "Prosome Length (mm)",
y = "Total Egg Volume (mm^3)") +
theme_matt()

Data for just Skistodiaptomus pallidus is shown below. Point
color is arranged according to latitude.
ctmax_data %>%
filter(species == "skistodiaptomus_pallidus") %>%
mutate(site = fct_reorder(site, lat, .desc = T)) %>%
# group_by(site) %>%
# summarise(size = mean(size, na.rm = T),
# total_egg_volume = mean(total_egg_volume, na.rm = T)) %>%
ggplot(aes(x = size, y = total_egg_volume)) +
geom_smooth(method = "lm", formula = y ~ exp(x),
colour = "black") +
geom_point(aes(colour = site))+
scale_color_viridis_d(direction = 1,
option = "D") +
labs(x = "Prosome Length (mm)",
y = "Total Egg Volume (mm^3)") +
theme_matt() +
theme(legend.position = "right")

model_data = ctmax_data %>%
mutate("genus" = str_split_fixed(species, pattern = "_", n = 2)[,1],
genus = tools::toTitleCase(genus),
"doy" = yday(collection_date)) %>%
select(site, collection_date, doy, collection_temp, lat, elevation, species, genus, sample_id, fecundity, total_egg_volume, size, ctmax) %>%
filter(genus != "MH") %>%
mutate(total_egg_volume = if_else(is.na(total_egg_volume), 0, total_egg_volume),
collection_temp_sc = scale(collection_temp),
lat_sc = scale(lat),
elevation_sc = scale(elevation),
tev_sc = scale(total_egg_volume))
ctmax_overall.model = lm(data = model_data,
ctmax ~ genus + collection_temp + lat + elevation + total_egg_volume)
drop1(ctmax_overall.model, test = "F")
## Single term deletions
##
## Model:
## ctmax ~ genus + collection_temp + lat + elevation + total_egg_volume
## Df Sum of Sq RSS AIC F value Pr(>F)
## <none> 485.97 -4.365
## genus 2 138.079 624.04 117.677 70.6070 < 2.2e-16 ***
## collection_temp 1 105.341 591.31 92.519 107.7332 < 2.2e-16 ***
## lat 1 113.236 599.20 99.203 115.8076 < 2.2e-16 ***
## elevation 1 6.509 492.48 0.341 6.6572 0.01016 *
## total_egg_volume 1 21.484 507.45 15.438 21.9722 3.578e-06 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#MuMIn::dredge(ctmax_temp.model)
car::Anova(ctmax_overall.model)
## Anova Table (Type II tests)
##
## Response: ctmax
## Sum Sq Df F value Pr(>F)
## genus 138.08 2 70.6070 < 2.2e-16 ***
## collection_temp 105.34 1 107.7332 < 2.2e-16 ***
## lat 113.24 1 115.8076 < 2.2e-16 ***
## elevation 6.51 1 6.6572 0.01016 *
## total_egg_volume 21.48 1 21.9722 3.578e-06 ***
## Residuals 485.97 497
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
performance::check_model(ctmax_overall.model)

egg.model = lm(data = model_data,
ctmax ~ collection_temp + total_egg_volume + size)
performance::check_model(egg.model)

effectsize::effectsize(egg.model)
## # Standardization method: refit
##
## Parameter | Std. Coef. | 95% CI
## ---------------------------------------------
## (Intercept) | 6.39e-16 | [-0.07, 0.07]
## collection temp | 0.61 | [ 0.54, 0.68]
## total egg volume | 0.15 | [ 0.08, 0.23]
## size | 0.37 | [ 0.30, 0.44]
emmeans::emmeans(ctmax_overall.model, specs = "genus") %>%
data.frame() %>%
mutate(genus = fct_reorder(genus, .x = emmean, .desc = T)) %>%
ggplot(aes(genus, y = emmean)) +
geom_point(size = 4) +
geom_errorbar(aes(ymin = emmean - SE, ymax = emmean + SE),
width = 0.2, linewidth = 1) +
labs(x = "") +
theme_matt() +
theme(axis.text.x = element_text(angle = 300, hjust = 0, vjust = 0.5))

ctmax_temp.model = lm(data = model_data,
ctmax ~ species + collection_temp)
drop1(ctmax_temp.model,
scope = ~.,
test = "F")
## Single term deletions
##
## Model:
## ctmax ~ species + collection_temp
## Df Sum of Sq RSS AIC F value Pr(>F)
## <none> 328.04 -196.438
## species 8 587.82 915.86 305.034 110.65 < 2.2e-16 ***
## collection_temp 1 116.01 444.05 -45.823 174.70 < 2.2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
performance::check_model(ctmax_temp.model)

sp_means = emmeans::emmeans(ctmax_temp.model, "species") %>%
data.frame() %>%
drop_na() %>%
select(species, "ctmax" = emmean, lower.CL, upper.CL)
sp_means %>%
mutate(species = str_replace(species, pattern = "_", replacement = " "),
species = str_to_sentence(species),
species = fct_reorder(species, .x = ctmax)) %>%
ggplot(aes(x = species, y = ctmax, colour = species)) +
geom_point(size = 3) +
geom_errorbar(aes(ymin = lower.CL, ymax = upper.CL),
width = 0.5) +
scale_colour_manual(values = skisto_cols) +
theme_matt() +
theme(axis.text = element_text(angle = 300, hjust = 0, vjust = 0.5),
legend.position = "none")

ctmax_data %>%
mutate(group_id = paste(site, species, collection_date)) %>%
ggplot(aes(x = fecundity, y = site, fill = site)) +
geom_density_ridges(bandwidth = 2,
jittered_points = TRUE,
point_shape = 21,
point_size = 1,
point_colour = "grey30",
point_alpha = 0.6,
alpha = 0.9,
position = position_points_jitter(
height = 0.1, width = 0)) +
scale_fill_viridis_d(option = "D", direction = -1) +
theme_matt() +
theme(legend.position = "none")

ctmax_data %>%
mutate(group_id = paste(site, species, collection_date)) %>%
ggplot(aes(x = size, y = site, fill = site, group = group_id)) +
geom_density_ridges(bandwidth = 0.02,
jittered_points = TRUE,
point_shape = 21,
point_size = 1,
point_colour = "grey30",
point_alpha = 0.6,
alpha = 0.9,
position = position_points_jitter(
height = 0.1, width = 0)) +
scale_fill_viridis_d(option = "D", direction = -1) +
theme_matt() +
theme(legend.position = "none")

ctmax_data %>%
mutate(group_id = paste(site, species, collection_date)) %>%
ggplot(aes(x = ctmax, y = site, fill = site, group = group_id)) +
geom_density_ridges(bandwidth = 0.3,
jittered_points = TRUE,
point_shape = 21,
point_size = 1,
point_colour = "grey30",
point_alpha = 0.6,
alpha = 0.9,
position = position_points_jitter(
height = 0.1, width = 0)) +
scale_fill_viridis_d(option = "D", direction = -1) +
labs(x = "CTmax (°C)") +
theme_matt() +
theme(legend.position = "none")

F3 Data
Skistodiaptomus pallidus was collected from three sites
(Centennial Park - CO, Ochsner Pond - OH, and Center Springs Pond - CT)
were reared in the lab at 16°C for at least three generations. CTmax was
measured for these copepods to test for genetic variation in thermal
limits in this widely distributed species.
Lab reared copepods varied in size, with Centennial Park individuals
~0.1 mm longer than those from Ochsner Pond.
f3_data %>%
ggplot(aes(x = site, y = size)) +
geom_boxplot() +
geom_point(position = position_jitter(height = 0, width = 0.1)) +
labs(x = "Site",
y = "Prosome Length (mm)") +
theme_matt()

f3_size.model = lme4::lmer(data = f3_data,
size ~ site + (1 | experiment_date))
#performance::check_model(f3_size.model)
car::Anova(f3_size.model)
## Analysis of Deviance Table (Type II Wald chisquare tests)
##
## Response: size
## Chisq Df Pr(>Chisq)
## site 25.398 1 4.664e-07 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Upper thermal limit did not vary between the populations.
f3_data %>%
ggplot(aes(x = site, y = ctmax)) +
geom_boxplot() +
geom_point(position = position_jitter(height = 0, width = 0.1)) +
labs(x = "Site",
y = "CTmax (°C)") +
theme_matt()

f3_ctmax.model = lme4::lmer(data = f3_data,
ctmax ~ site + (1|experiment_date) + (1|tube))
#performance::check_model(f3_ctmax.model)
car::Anova(f3_ctmax.model)
## Analysis of Deviance Table (Type II Wald chisquare tests)
##
## Response: ctmax
## Chisq Df Pr(>Chisq)
## site 0.827 1 0.3631
f3_data %>%
group_by(experiment_date, site) %>%
summarise(mean_ctmax = mean(ctmax),
se_ctmax = sd(ctmax) / sqrt(n())) %>%
ggplot(aes(experiment_date, y = mean_ctmax, colour = site, group = site)) +
geom_point(data = f3_data,
aes(x = experiment_date, y = ctmax, colour = site),
size = 1, alpha = 0.3,
position = position_jitterdodge(jitter.height = 0, jitter.width = 0.05,
dodge.width = 0.3)) +
geom_line(linewidth = 1.3,
position = position_dodge(width = 0.3)) +
geom_errorbar(aes(ymin = mean_ctmax - se_ctmax, ymax = mean_ctmax + se_ctmax),
position = position_dodge(width = 0.3),
width = 0.25, linewidth = 1) +
geom_point(size = 3,
position = position_dodge(width = 0.3)) +
labs(x = "Experiment Date",
y = "CTmax (°C)") +
theme_matt() +
theme(legend.position = "right")

Fecundity also appears to vary between populations, even after
rearing in lab for several generations, although this difference does
not appear to be significant.
ggplot(f3_data, aes(x = site, y = fecundity)) +
geom_boxplot() +
geom_point(position = position_jitter(height = 0, width = 0.1)) +
labs(x = "Site",
y = "Clutch Size (eggs per female)") +
theme_matt()

# f3_fecund.model = glm(data = f3_data,
# fecundity ~ site,
# family="poisson")
f3_fecund.model = lme4::glmer(data = f3_data,
fecundity ~ site + (1|experiment_date),
family="poisson")
# performance::check_model(f3_fecund.model)
car::Anova(f3_fecund.model)
## Analysis of Deviance Table (Type II Wald chisquare tests)
##
## Response: fecundity
## Chisq Df Pr(>Chisq)
## site 2.1596 1 0.1417
We also examined how oxygen consumption rates varied across
temperatures for the two populations. Results are preliminary, but it
seems like the two populations may have similar optimum
temperatures.
tpc_rates %>%
filter(temp != 32) %>%
filter(!(temp > 15 & rsq < 0.7)) %>%
ggplot(aes(x = temp, y = rate, colour = treatment)) +
#facet_wrap(treatment~., nrow = 2) +
geom_point() +
geom_smooth() +
theme_bw()

To summarize the initial findings, Centennial Park copepods had
larger body sizes but smaller clutch sizes than copepods from Ochsner
Pond. CTmax and thermal optima were similar between the two
populations.
LS0tCnRpdGxlOiBEaWFwdG9taWQgVGhlcm1hbCBMaW1pdHMKZGF0ZTogImByIFN5cy5EYXRlKClgIgpvdXRwdXQ6IAogIGh0bWxfZG9jdW1lbnQ6CiAgICAgICAgICBjb2RlX2ZvbGRpbmc6IGhpZGUKICAgICAgICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKICAgICAgICAgIHRvYzogdHJ1ZQogICAgICAgICAgdG9jX2Zsb2F0OiB0cnVlCiAgZ2l0aHViX2RvY3VtZW50OgogICAgICAgICAgaHRtbF9wcmV2aWV3OiBmYWxzZQogICAgICAgICAgdG9jOiB0cnVlCiAgICAgICAgICB0b2NfZGVwdGg6IDMKLS0tCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1ULCBtZXNzYWdlID0gRiwgd2FybmluZyA9IEYsIGVjaG8gPSBGfQprbml0cjo6b3B0c19jaHVuayRzZXQoCiAgZWNobyA9IGtuaXRyOjppc19odG1sX291dHB1dCgpLAogIGZpZy5hbGlnbiA9ICJjZW50ZXIiLAogIGZpZy5wYXRoID0gIi4uL0ZpZ3VyZXMvbWFya2Rvd24vIiwKICBkZXYgPSBjKCJwbmciLCAicGRmIiksCiAgbWVzc2FnZSA9IEZBTFNFLAogIHdhcm5pbmcgPSBGQUxTRSwKICBjb2xsYXBzZSA9IFQKKQoKdGhlbWVfbWF0dCA9IGZ1bmN0aW9uKGJhc2Vfc2l6ZSA9IDE4LAogICAgICAgICAgICAgICAgICAgICAgZGFya190ZXh0ID0gImdyZXkyMCIpewogIG1pZF90ZXh0IDwtICBtb25vY2hyb21lUjo6Z2VuZXJhdGVfcGFsZXR0ZShkYXJrX3RleHQsICJnb19saWdodGVyIiwgbl9jb2xvdXJzID0gNSlbMl0KICBsaWdodF90ZXh0IDwtICBtb25vY2hyb21lUjo6Z2VuZXJhdGVfcGFsZXR0ZShkYXJrX3RleHQsICJnb19saWdodGVyIiwgbl9jb2xvdXJzID0gNSlbM10KICAKICBnZ3B1YnI6OnRoZW1lX3B1YnIoYmFzZV9mYW1pbHk9InNhbnMiKSAlK3JlcGxhY2UlIAogICAgdGhlbWUoCiAgICAgIHBhbmVsLmJhY2tncm91bmQgID0gZWxlbWVudF9yZWN0KGZpbGw9InRyYW5zcGFyZW50IiwgY29sb3VyPU5BKSwgCiAgICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsPSJ0cmFuc3BhcmVudCIsIGNvbG91cj1OQSksIAogICAgICBsZWdlbmQuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsPSJ0cmFuc3BhcmVudCIsIGNvbG91cj1OQSksCiAgICAgIGxlZ2VuZC5rZXkgPSBlbGVtZW50X3JlY3QoZmlsbD0idHJhbnNwYXJlbnQiLCBjb2xvdXI9TkEpLAogICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG91ciA9IG1pZF90ZXh0LCBsaW5laGVpZ2h0ID0gMS4xKSwKICAgICAgdGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IGJhc2Vfc2l6ZSAqIDEuNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3VyID0gZGFya190ZXh0KSwKICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSBiYXNlX3NpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSBtaWRfdGV4dCksCiAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gYmFzZV9zaXplICogMS4yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luID0gdW5pdChjKDMsIDAsIDAsIDApLCAibW0iKSksCiAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gYmFzZV9zaXplICogMS4yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luID0gdW5pdChjKDAsIDUsIDAsIDApLCAibW0iKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmdsZSA9IDkwKSwKICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZT1iYXNlX3NpemUgKiAwLjkpLAogICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IGJhc2Vfc2l6ZSAqIDAuOSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlID0gImJvbGQiKSwKICAgICAgcGxvdC5tYXJnaW4gPSBtYXJnaW4oMC4yNSwgMC4yNSwgMC4yNSwgMC4yNSwiY20iKQogICAgKQp9Cgp0aGVtZV9tYXR0X2ZhY2V0cyA9IGZ1bmN0aW9uKGJhc2Vfc2l6ZSA9IDE4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhcmtfdGV4dCA9ICJncmV5MjAiKXsKICBtaWRfdGV4dCA8LSAgbW9ub2Nocm9tZVI6OmdlbmVyYXRlX3BhbGV0dGUoZGFya190ZXh0LCAiZ29fbGlnaHRlciIsIG5fY29sb3VycyA9IDUpWzJdCiAgbGlnaHRfdGV4dCA8LSAgbW9ub2Nocm9tZVI6OmdlbmVyYXRlX3BhbGV0dGUoZGFya190ZXh0LCAiZ29fbGlnaHRlciIsIG5fY29sb3VycyA9IDUpWzNdCiAgCiAgdGhlbWVfYncoYmFzZV9mYW1pbHk9InNhbnMiKSAlK3JlcGxhY2UlIAogICAgdGhlbWUoCiAgICAgIHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgIHBhbmVsLmJhY2tncm91bmQgID0gZWxlbWVudF9yZWN0KGZpbGw9InRyYW5zcGFyZW50IiwgY29sb3VyPU5BKSwgCiAgICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsPSJ0cmFuc3BhcmVudCIsIGNvbG91cj1OQSksIAogICAgICBsZWdlbmQuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsPSJ0cmFuc3BhcmVudCIsIGNvbG91cj1OQSksCiAgICAgIGxlZ2VuZC5rZXkgPSBlbGVtZW50X3JlY3QoZmlsbD0idHJhbnNwYXJlbnQiLCBjb2xvdXI9TkEpLAogICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG91ciA9IG1pZF90ZXh0LCBsaW5laGVpZ2h0ID0gMS4xKSwKICAgICAgc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSBiYXNlX3NpemUpLAogICAgICB0aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gYmFzZV9zaXplICogMS41LAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSBkYXJrX3RleHQpLAogICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IGJhc2Vfc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG91ciA9IG1pZF90ZXh0KSwKICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSBiYXNlX3NpemUgKiAxLjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW4gPSB1bml0KGMoMywgMCwgMCwgMCksICJtbSIpKSwKICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSBiYXNlX3NpemUgKiAxLjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW4gPSB1bml0KGMoMCwgNSwgMCwgMCksICJtbSIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZ2xlID0gOTApLAogICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPWJhc2Vfc2l6ZSAqIDAuOSksCiAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gYmFzZV9zaXplICogMC45LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UgPSAiYm9sZCIpLAogICAgICBwbG90Lm1hcmdpbiA9IG1hcmdpbigwLjI1LCAwLjI1LCAwLjI1LCAwLjI1LCJjbSIpCiAgICApCn0KYGBgCgojIyBTaXRlIE1hcAoKYGBge3Igc2FtcGxlZC1zaXRlcywgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTZ9CmNvb3JkcyA9IGN0bWF4X2RhdGEgJT4lCiAgaW5uZXJfam9pbihzaXRlX2RhdGEsIGJ5ID0gYygic2l0ZSIsICJsYXQiLCAiY29sbGVjdGlvbl90ZW1wIikpICU+JSAKICBkcGx5cjo6c2VsZWN0KHNpdGUsIGxvbmcsIGxhdCwgY29sbGVjdGlvbl90ZW1wLCBlbGV2YXRpb24pICU+JQogIGRyb3BfbmEoY29sbGVjdGlvbl90ZW1wKSAlPiUgCiAgZGlzdGluY3QoKQoKbWFwX2RhdGEoIndvcmxkIikgJT4lIAogIGZpbHRlcihyZWdpb24gJWluJSBjKCJVU0EiLCAiQ2FuYWRhIikpICU+JSAKICBnZ3Bsb3QoKSArIAogIGdlb21fcG9seWdvbihhZXMoeCA9IGxvbmcsIHkgPSBsYXQsIGdyb3VwID0gZ3JvdXApLAogICAgICAgICAgICAgICBmaWxsID0gImdyZXk5MiIsIGNvbG91ciA9ICJncmV5NDAiLCBsaW5ld2lkdGggPSAwLjEpICsgCiAgY29vcmRfbWFwKHhsaW0gPSBjKC0xMTAsLTYwKSwKICAgICAgICAgICAgeWxpbSA9IGMoMjUsIDU1KSkgKyAKICBnZW9tX3BvaW50KGRhdGEgPSBjb29yZHMsCiAgICAgICAgICAgICBtYXBwaW5nID0gYWVzKHggPSBsb25nLCB5ID0gbGF0KSwKICAgICAgICAgICAgIHNpemUgPSAyKSArCiAgbGFicyh4ID0gIkxvbmdpdHVkZSIsIAogICAgICAgeSA9ICJMYXRpdHVkZSIsCiAgICAgICBjb2xvdXIgPSAiRWxldi4gKG0pIikgKyAKICB0aGVtZV9tYXR0KCkgKyAKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAicmlnaHQiKQpgYGAKCiMjIENUbWF4IERhdGEgCgpgYGB7ciBmaWcud2lkdGg9MTQsIGZpZy5oZWlnaHQ9MTB9CnRlbXBfbGF0X3Bsb3QgPSBjdG1heF9kYXRhICU+JSAKICBzZWxlY3QobGF0LCBjb2xsZWN0aW9uX3RlbXApICU+JSAKICBkaXN0aW5jdCgpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBsYXQsIHkgPSBjb2xsZWN0aW9uX3RlbXApKSArIAogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIGNvbG91ciA9ICJibGFjayIpICsgCiAgZ2VvbV9wb2ludChzaXplID0gMykgKyAKICBsYWJzKHggPSAiTGF0aXR1ZGUiLCAKICAgICAgIHkgPSAiQ29sbGVjdGlvbiBUZW1wLiAowrBDKSIpICsgCiAgdGhlbWVfbWF0dCgpICsgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInJpZ2h0IikKCmN0bWF4X3RlbXBfcGxvdCA9IGN0bWF4X2RhdGEgJT4lIAogIG11dGF0ZShzcGVjaWVzID0gc3RyX3JlcGxhY2Uoc3BlY2llcywgIl8iLCAiICIpLAogICAgICAgICBzcGVjaWVzID0gc3RyX3RvX3NlbnRlbmNlKHNwZWNpZXMpKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gY29sbGVjdGlvbl90ZW1wLCB5ID0gY3RtYXgpKSArIAogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIGNvbG91ciA9ICJibGFjayIpICsgCiAgZ2VvbV9wb2ludChhZXMoY29sb3VyID0gc3BlY2llcyksIAogICAgICAgICAgICAgc2l6ZSA9IDMpICsgCiAgbGFicyh4ID0gIkNvbGxlY3Rpb24gVGVtcC4gKMKwQykiLCAKICAgICAgIHkgPSAiQ1RtYXggKMKwQykiKSArIAogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gc2tpc3RvX2NvbHMpICsgCiAgdGhlbWVfbWF0dCgpICsgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInJpZ2h0IikKCmN0bWF4X2xhdF9wbG90ID0gY3RtYXhfZGF0YSAlPiUgCiAgbXV0YXRlKHNwZWNpZXMgPSBzdHJfcmVwbGFjZShzcGVjaWVzLCAiXyIsICIgIiksCiAgICAgICAgIHNwZWNpZXMgPSBzdHJfdG9fc2VudGVuY2Uoc3BlY2llcykpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBsYXQsIHkgPSBjdG1heCkpICsgCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgY29sb3VyID0gImJsYWNrIikgKyAKICBnZW9tX3BvaW50KGFlcyhjb2xvdXIgPSBzcGVjaWVzKSwgCiAgICAgICAgICAgICBzaXplID0gMykgKyAKICBsYWJzKHggPSAiTGF0aXR1ZGUiLCAKICAgICAgIHkgPSAiQ1RtYXggKMKwQykiKSArIAogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gc2tpc3RvX2NvbHMpICsgCiAgdGhlbWVfbWF0dCgpICsgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInJpZ2h0IikKCmN0bWF4X2VsZXZfcGxvdCA9IGN0bWF4X2RhdGEgJT4lIAogIG11dGF0ZShzcGVjaWVzID0gc3RyX3JlcGxhY2Uoc3BlY2llcywgIl8iLCAiICIpLAogICAgICAgICBzcGVjaWVzID0gc3RyX3RvX3NlbnRlbmNlKHNwZWNpZXMpKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gZWxldmF0aW9uLCB5ID0gY3RtYXgpKSArIAogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIGNvbG91ciA9ICJibGFjayIpICsgCiAgZ2VvbV9wb2ludChhZXMoY29sb3VyID0gc3BlY2llcyksIAogICAgICAgICAgICAgc2l6ZSA9IDMpICsKICBsYWJzKHggPSAiRWxldmF0aW9uIChtKSIsIAogICAgICAgeSA9ICJDVG1heCAowrBDKSIpICsKICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IHNraXN0b19jb2xzKSArIAogIHRoZW1lX21hdHQoKSArIAogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIpCgpnZ3B1YnI6OmdnYXJyYW5nZSh0ZW1wX2xhdF9wbG90LCBjdG1heF90ZW1wX3Bsb3QsIGN0bWF4X2xhdF9wbG90LCBjdG1heF9lbGV2X3Bsb3QsIGNvbW1vbi5sZWdlbmQgPSBULCBsZWdlbmQgPSAicmlnaHQiLCBucm93ID0gMiwgbmNvbCA9IDIsIGxhYmVscyA9ICJBVVRPIikKYGBgCgpgYGB7ciBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9N30KY3RtYXhfZGF0YSAlPiUgCiAgbXV0YXRlKHNwZWNpZXMgPSBzdHJfcmVwbGFjZShzcGVjaWVzLCAiXyIsICIgIiksCiAgICAgICAgIHNwZWNpZXMgPSBzdHJfdG9fc2VudGVuY2Uoc3BlY2llcykpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBjb2xsZWN0aW9uX3RlbXAsIHkgPSBjdG1heCwgY29sb3VyID0gc3BlY2llcykpICsgCiAgZmFjZXRfd3JhcChzcGVjaWVzfi4pICsgCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgY29sb3VyID0gImJsYWNrIikgKyAKICBnZW9tX3BvaW50KCkgKyAKICBsYWJzKHggPSAiQ29sbGVjdGlvbiBUZW1wLiAowrBDKSIsCiAgICAgICB5ID0gIkNUbWF4ICjCsEMpIikgKyAKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gc2tpc3RvX2NvbHMpICsgCiAgdGhlbWVfbWF0dCgpICsgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQpgYGAKCmBgYHtyIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD02fQpjdG1heF9kYXRhICU+JSAKICBmaWx0ZXIoc3RyX2RldGVjdChzcGVjaWVzLCBwYXR0ZXJuID0gInNraXN0byIpIHwgCiAgICAgICAgICAgc3RyX2RldGVjdChzcGVjaWVzLCBwYXR0ZXJuID0gImxlcHRvIikgfCAKICAgICAgICAgICBzdHJfZGV0ZWN0KHNwZWNpZXMsIHBhdHRlcm4gPSAiYWdsYW8iKSkgJT4lIAogIG11dGF0ZShzcGVjaWVzID0gc3RyX3JlcGxhY2Uoc3BlY2llcywgIl8iLCAiICIpLAogICAgICAgICBzcGVjaWVzID0gc3RyX3RvX3NlbnRlbmNlKHNwZWNpZXMpKSAlPiUgCiAgZ3JvdXBfYnkoY29sbGVjdGlvbl9kYXRlLCBzcGVjaWVzLCBjb2xsZWN0aW9uX3RlbXApICU+JSAKICBzdW1tYXJpc2UobWVhbl9jdG1heCA9IG1lYW4oY3RtYXgpLAogICAgICAgICAgICBjdG1heF9zZCA9IHNkKGN0bWF4KSwKICAgICAgICAgICAgY3RtYXhfbiA9IG4oKSwgCiAgICAgICAgICAgIGN0bWF4X3NlID0gY3RtYXhfc2QgLyBzcXJ0KGN0bWF4X24pKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gY29sbGVjdGlvbl90ZW1wLCB5ID0gbWVhbl9jdG1heCwgY29sb3VyID0gc3BlY2llcykpICsgCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2U9RiwgbGluZXdpZHRoID0gMikgKyAKICBnZW9tX3BvaW50KHNpemUgPSAyKSArIAogIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSBtZWFuX2N0bWF4IC0gY3RtYXhfc2UsIAogICAgICAgICAgICAgICAgICAgIHltYXggPSBtZWFuX2N0bWF4ICsgY3RtYXhfc2UpLAogICAgICAgICAgICAgICAgd2lkdGggPSAwLjMsIGxpbmV3aWR0aCA9IDEpICsgCiAgbGFicyh4ID0gIkNvbGxlY3Rpb24gVGVtcC4gKMKwQykiLAogICAgICAgeSA9ICJDVG1heCAowrBDKSIpICsgCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBza2lzdG9fY29scykgKyAKICB0aGVtZV9tYXR0KCkgKyAKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAicmlnaHQiKQpgYGAKCmBgYHtyIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD03fQpjdG1heF9kYXRhICU+JSAKICBtdXRhdGUoc3BlY2llcyA9IHN0cl9yZXBsYWNlKHNwZWNpZXMsICJfIiwgIiAiKSwKICAgICAgICAgc3BlY2llcyA9IHN0cl90b19zZW50ZW5jZShzcGVjaWVzKSkgJT4lIAogIGdncGxvdChhZXMoeCA9IGNvbGxlY3Rpb25fdGVtcCwgeSA9IHNpemUsIGNvbG91ciA9IHNwZWNpZXMpKSArIAogIGZhY2V0X3dyYXAoc3BlY2llc34uKSArIAogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIGNvbG91ciA9ICJibGFjayIpICsgCiAgZ2VvbV9wb2ludCgpICsgCiAgbGFicyh4ID0gIkNvbGxlY3Rpb24gVGVtcC4gKMKwQykiLAogICAgICAgeSA9ICJQcm9zb21lIExlbmd0aCAobW0pIikgKyAKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gc2tpc3RvX2NvbHMpICsgCiAgdGhlbWVfbWF0dCgpICsgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQpgYGAKCmBgYHtyIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD03fQpjdG1heF9kYXRhICU+JSAKICBtdXRhdGUoc3BlY2llcyA9IHN0cl9yZXBsYWNlKHNwZWNpZXMsICJfIiwgIiAiKSwKICAgICAgICAgc3BlY2llcyA9IHN0cl90b19zZW50ZW5jZShzcGVjaWVzKSkgJT4lIAogIGdncGxvdChhZXMoeCA9IGNvbGxlY3Rpb25fdGVtcCwgeSA9IGVnZ192b2x1bWUsIGNvbG91ciA9IHNwZWNpZXMpKSArIAogIGZhY2V0X3dyYXAoc3BlY2llc34uKSArIAogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIGNvbG91ciA9ICJibGFjayIpICsgCiAgZ2VvbV9wb2ludCgpICsgCiAgbGFicyh4ID0gIkNvbGxlY3Rpb24gVGVtcC4gKMKwQykiLAogICAgICAgeSA9ICJFZ2cgVm9sdW1lIChtbV4zKSIpICsgCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IHNraXN0b19jb2xzKSArIAogIHRoZW1lX21hdHQoKSArIAogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikKYGBgCgpgYGB7cn0KY3RtYXhfZGF0YSAlPiUgCiAgc2VsZWN0KGVsZXZhdGlvbiwgY29sbGVjdGlvbl90ZW1wKSAlPiUgCiAgZGlzdGluY3QoKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gZWxldmF0aW9uLCB5ID0gY29sbGVjdGlvbl90ZW1wKSkgKyAKICBnZW9tX3BvaW50KHNpemUgPSAzKSArCiAgbGFicyh4ID0gIkVsZXZhdGlvbiAobSkiLCAKICAgICAgIHkgPSAiQ29sbGVjdGlvbiBUZW1wLiAowrBDKSIpICsgCiAgdGhlbWVfbWF0dCgpCmBgYAoKYGBge3IgZmlnLndpZHRoPTgsIGZpZy5oZWlnaHQ9N30KY3RtYXhfZGF0YSAlPiUgCiAgbXV0YXRlKHNwZWNpZXMgPSBzdHJfcmVwbGFjZShzcGVjaWVzLCAiXyIsICIgIiksCiAgICAgICAgIHNwZWNpZXMgPSBzdHJfdG9fc2VudGVuY2Uoc3BlY2llcykpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBzaXplLCB5ID0gY3RtYXgsIGNvbG91ciA9IHNwZWNpZXMpKSArIAogICNmYWNldF93cmFwKC5+c3BlY2llcykgKyAKICBnZW9tX3BvaW50KHNpemUgPSAxKSArIAogIHRoZW1lX21hdHQoKSArIAogIGxhYnMoeCA9ICJMZW5ndGggKG1tKSIsIAogICAgICAgeSA9ICJDVG1heCAowrBDKSIpICsgCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBza2lzdG9fY29scykgKyAKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpCmBgYAoKYGBge3IgZmlnLndpZHRoPTgsIGZpZy5oZWlnaHQ9N30KY3RtYXhfZGF0YSAlPiUgCiAgbXV0YXRlKHNwZWNpZXMgPSBzdHJfcmVwbGFjZShzcGVjaWVzLCAiXyIsICIgIiksCiAgICAgICAgIHNwZWNpZXMgPSBzdHJfdG9fc2VudGVuY2Uoc3BlY2llcykpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBzaXplLCB5ID0gZmVjdW5kaXR5LCBjb2xvdXIgPSBzcGVjaWVzKSkgKyAKICBmYWNldF93cmFwKC5+c3BlY2llcykgKyAKICBnZW9tX3BvaW50KHNpemUgPSAxKSArIAogIHRoZW1lX21hdHQoKSArIAogIGxhYnMoeCA9ICJMZW5ndGggKG1tKSIsIAogICAgICAgeSA9ICJGZWN1bmRpdHkgKCMgZWdncykiKSArIAogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gc2tpc3RvX2NvbHMpICsgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQpgYGAKCmBgYHtyfQpnZ3Bsb3QoY3RtYXhfZGF0YSwgYWVzKHggPSBzaXplLCB5ID0gdG90YWxfZWdnX3ZvbHVtZSkpICsgCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgZm9ybXVsYSA9IHkgfiBleHAoeCkpICsgCiAgZ2VvbV9wb2ludCgpKwogIGxhYnMoeCA9ICJQcm9zb21lIExlbmd0aCAobW0pIiwKICAgICAgIHkgPSAiVG90YWwgRWdnIFZvbHVtZSAobW1eMykiKSArIAogIHRoZW1lX21hdHQoKQoKYGBgCgpEYXRhIGZvciBqdXN0ICpTa2lzdG9kaWFwdG9tdXMgcGFsbGlkdXMqIGlzIHNob3duIGJlbG93LiBQb2ludCBjb2xvciBpcyBhcnJhbmdlZCBhY2NvcmRpbmcgdG8gbGF0aXR1ZGUuIApgYGB7ciBmaWcud2lkdGg9OC41LCBmaWcuaGVpZ2h0PTUuNX0KY3RtYXhfZGF0YSAlPiUgCiAgZmlsdGVyKHNwZWNpZXMgPT0gInNraXN0b2RpYXB0b211c19wYWxsaWR1cyIpICU+JQogIG11dGF0ZShzaXRlID0gZmN0X3Jlb3JkZXIoc2l0ZSwgbGF0LCAuZGVzYyA9IFQpKSAlPiUgCiAgIyBncm91cF9ieShzaXRlKSAlPiUgCiAgIyBzdW1tYXJpc2Uoc2l6ZSA9IG1lYW4oc2l6ZSwgbmEucm0gPSBUKSwgCiAgIyAgICAgICAgICB0b3RhbF9lZ2dfdm9sdW1lID0gbWVhbih0b3RhbF9lZ2dfdm9sdW1lLCBuYS5ybSA9IFQpKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gc2l6ZSwgeSA9IHRvdGFsX2VnZ192b2x1bWUpKSArIAogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIGZvcm11bGEgPSB5IH4gZXhwKHgpLCAKICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siKSArIAogIGdlb21fcG9pbnQoYWVzKGNvbG91ciA9IHNpdGUpKSsKICBzY2FsZV9jb2xvcl92aXJpZGlzX2QoZGlyZWN0aW9uID0gMSwgCiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbiA9ICJEIikgKyAKICBsYWJzKHggPSAiUHJvc29tZSBMZW5ndGggKG1tKSIsCiAgICAgICB5ID0gIlRvdGFsIEVnZyBWb2x1bWUgKG1tXjMpIikgKyAKICB0aGVtZV9tYXR0KCkgKyAKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAicmlnaHQiKQpgYGAKCgpgYGB7cn0KbW9kZWxfZGF0YSA9IGN0bWF4X2RhdGEgJT4lIAogIG11dGF0ZSgiZ2VudXMiID0gc3RyX3NwbGl0X2ZpeGVkKHNwZWNpZXMsIHBhdHRlcm4gPSAiXyIsIG4gPSAyKVssMV0sCiAgICAgICAgIGdlbnVzID0gdG9vbHM6OnRvVGl0bGVDYXNlKGdlbnVzKSwKICAgICAgICAgImRveSIgPSB5ZGF5KGNvbGxlY3Rpb25fZGF0ZSkpICU+JSAKICBzZWxlY3Qoc2l0ZSwgY29sbGVjdGlvbl9kYXRlLCBkb3ksIGNvbGxlY3Rpb25fdGVtcCwgbGF0LCBlbGV2YXRpb24sIHNwZWNpZXMsIGdlbnVzLCBzYW1wbGVfaWQsIGZlY3VuZGl0eSwgdG90YWxfZWdnX3ZvbHVtZSwgc2l6ZSwgY3RtYXgpICU+JSAKICBmaWx0ZXIoZ2VudXMgIT0gIk1IIikgJT4lICAKICBtdXRhdGUodG90YWxfZWdnX3ZvbHVtZSA9IGlmX2Vsc2UoaXMubmEodG90YWxfZWdnX3ZvbHVtZSksIDAsIHRvdGFsX2VnZ192b2x1bWUpLAogICAgICAgICBjb2xsZWN0aW9uX3RlbXBfc2MgPSBzY2FsZShjb2xsZWN0aW9uX3RlbXApLAogICAgICAgICBsYXRfc2MgPSBzY2FsZShsYXQpLCAKICAgICAgICAgZWxldmF0aW9uX3NjID0gc2NhbGUoZWxldmF0aW9uKSwKICAgICAgICAgdGV2X3NjID0gc2NhbGUodG90YWxfZWdnX3ZvbHVtZSkpIAoKY3RtYXhfb3ZlcmFsbC5tb2RlbCA9IGxtKGRhdGEgPSBtb2RlbF9kYXRhLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGN0bWF4IH4gZ2VudXMgKyBjb2xsZWN0aW9uX3RlbXAgKyBsYXQgKyBlbGV2YXRpb24gKyB0b3RhbF9lZ2dfdm9sdW1lKQoKZHJvcDEoY3RtYXhfb3ZlcmFsbC5tb2RlbCwgdGVzdCA9ICJGIikKCiNNdU1Jbjo6ZHJlZGdlKGN0bWF4X3RlbXAubW9kZWwpCgpjYXI6OkFub3ZhKGN0bWF4X292ZXJhbGwubW9kZWwpCgpwZXJmb3JtYW5jZTo6Y2hlY2tfbW9kZWwoY3RtYXhfb3ZlcmFsbC5tb2RlbCkKCmVnZy5tb2RlbCA9IGxtKGRhdGEgPSBtb2RlbF9kYXRhLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGN0bWF4IH4gY29sbGVjdGlvbl90ZW1wICsgdG90YWxfZWdnX3ZvbHVtZSArIHNpemUpCgpwZXJmb3JtYW5jZTo6Y2hlY2tfbW9kZWwoZWdnLm1vZGVsKQoKZWZmZWN0c2l6ZTo6ZWZmZWN0c2l6ZShlZ2cubW9kZWwpCgplbW1lYW5zOjplbW1lYW5zKGN0bWF4X292ZXJhbGwubW9kZWwsIHNwZWNzID0gImdlbnVzIikgJT4lIAogIGRhdGEuZnJhbWUoKSAlPiUgCiAgbXV0YXRlKGdlbnVzID0gZmN0X3Jlb3JkZXIoZ2VudXMsIC54ID0gZW1tZWFuLCAuZGVzYyA9IFQpKSAlPiUgCiAgZ2dwbG90KGFlcyhnZW51cywgeSA9IGVtbWVhbikpICsgCiAgZ2VvbV9wb2ludChzaXplID0gNCkgKyAKICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gZW1tZWFuIC0gU0UsIHltYXggPSBlbW1lYW4gKyBTRSksIAogICAgICAgICAgICAgICAgd2lkdGggPSAwLjIsIGxpbmV3aWR0aCA9IDEpICsgCiAgbGFicyh4ID0gIiIpICsgCiAgdGhlbWVfbWF0dCgpICsgCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSAzMDAsIGhqdXN0ID0gMCwgdmp1c3QgPSAwLjUpKQpgYGAKCmBgYHtyfQoKY3RtYXhfdGVtcC5tb2RlbCA9IGxtKGRhdGEgPSBtb2RlbF9kYXRhLCAKICAgICAgICAgICAgICAgICAgICAgIGN0bWF4IH4gc3BlY2llcyArIGNvbGxlY3Rpb25fdGVtcCkKCmRyb3AxKGN0bWF4X3RlbXAubW9kZWwsIAogICAgICBzY29wZSA9IH4uLAogICAgICB0ZXN0ID0gIkYiKQoKcGVyZm9ybWFuY2U6OmNoZWNrX21vZGVsKGN0bWF4X3RlbXAubW9kZWwpCgpzcF9tZWFucyA9IGVtbWVhbnM6OmVtbWVhbnMoY3RtYXhfdGVtcC5tb2RlbCwgInNwZWNpZXMiKSAlPiUgCiAgZGF0YS5mcmFtZSgpICU+JSAKICBkcm9wX25hKCkgJT4lICAKICBzZWxlY3Qoc3BlY2llcywgImN0bWF4IiA9IGVtbWVhbiwgbG93ZXIuQ0wsIHVwcGVyLkNMKQoKCnNwX21lYW5zICU+JSAKICBtdXRhdGUoc3BlY2llcyA9IHN0cl9yZXBsYWNlKHNwZWNpZXMsIHBhdHRlcm4gPSAiXyIsIHJlcGxhY2VtZW50ID0gIiAiKSwKICAgICAgICAgc3BlY2llcyA9IHN0cl90b19zZW50ZW5jZShzcGVjaWVzKSwKICAgICAgICAgc3BlY2llcyA9IGZjdF9yZW9yZGVyKHNwZWNpZXMsIC54ID0gY3RtYXgpKSAlPiUgCmdncGxvdChhZXMoeCA9IHNwZWNpZXMsIHkgPSBjdG1heCwgY29sb3VyID0gc3BlY2llcykpICsgCiAgZ2VvbV9wb2ludChzaXplID0gMykgKyAKICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gbG93ZXIuQ0wsIHltYXggPSB1cHBlci5DTCksIAogICAgICAgICAgICAgICAgd2lkdGggPSAwLjUpICsgCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBza2lzdG9fY29scykgKyAKICB0aGVtZV9tYXR0KCkgKyAKICB0aGVtZShheGlzLnRleHQgPSBlbGVtZW50X3RleHQoYW5nbGUgPSAzMDAsIGhqdXN0ID0gMCwgdmp1c3QgPSAwLjUpLCAKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpCgpgYGAKCgoKYGBge3IgZmVjdW5kaXR5LXJpZGdlcywgZmlnLndpZHRoPTgsIGZpZy5oZWlnaHQ9OH0KY3RtYXhfZGF0YSAlPiUgCiAgbXV0YXRlKGdyb3VwX2lkID0gcGFzdGUoc2l0ZSwgc3BlY2llcywgY29sbGVjdGlvbl9kYXRlKSkgJT4lIAogIGdncGxvdChhZXMoeCA9IGZlY3VuZGl0eSwgeSA9IHNpdGUsIGZpbGwgPSBzaXRlKSkgKyAKICBnZW9tX2RlbnNpdHlfcmlkZ2VzKGJhbmR3aWR0aCA9IDIsCiAgICAgICAgICAgICAgICAgICAgICBqaXR0ZXJlZF9wb2ludHMgPSBUUlVFLCAKICAgICAgICAgICAgICAgICAgICAgIHBvaW50X3NoYXBlID0gMjEsCiAgICAgICAgICAgICAgICAgICAgICBwb2ludF9zaXplID0gMSwKICAgICAgICAgICAgICAgICAgICAgIHBvaW50X2NvbG91ciA9ICJncmV5MzAiLAogICAgICAgICAgICAgICAgICAgICAgcG9pbnRfYWxwaGEgPSAwLjYsCiAgICAgICAgICAgICAgICAgICAgICBhbHBoYSA9IDAuOSwKICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fcG9pbnRzX2ppdHRlcigKICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0ID0gMC4xLCB3aWR0aCA9IDApKSArIAogIHNjYWxlX2ZpbGxfdmlyaWRpc19kKG9wdGlvbiA9ICJEIiwgZGlyZWN0aW9uID0gLTEpICsgCiAgdGhlbWVfbWF0dCgpICsgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQpgYGAKCmBgYHtyIHNpemUtcmlkZ2VzLCBmaWcud2lkdGg9OCwgZmlnLmhlaWdodD04fQpjdG1heF9kYXRhICU+JSAKICBtdXRhdGUoZ3JvdXBfaWQgPSBwYXN0ZShzaXRlLCBzcGVjaWVzLCBjb2xsZWN0aW9uX2RhdGUpKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gc2l6ZSwgeSA9IHNpdGUsIGZpbGwgPSBzaXRlLCBncm91cCA9IGdyb3VwX2lkKSkgKyAKICBnZW9tX2RlbnNpdHlfcmlkZ2VzKGJhbmR3aWR0aCA9IDAuMDIsCiAgICAgICAgICAgICAgICAgICAgICBqaXR0ZXJlZF9wb2ludHMgPSBUUlVFLCAKICAgICAgICAgICAgICAgICAgICAgIHBvaW50X3NoYXBlID0gMjEsCiAgICAgICAgICAgICAgICAgICAgICBwb2ludF9zaXplID0gMSwKICAgICAgICAgICAgICAgICAgICAgIHBvaW50X2NvbG91ciA9ICJncmV5MzAiLAogICAgICAgICAgICAgICAgICAgICAgcG9pbnRfYWxwaGEgPSAwLjYsCiAgICAgICAgICAgICAgICAgICAgICBhbHBoYSA9IDAuOSwKICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fcG9pbnRzX2ppdHRlcigKICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0ID0gMC4xLCB3aWR0aCA9IDApKSArIAogIHNjYWxlX2ZpbGxfdmlyaWRpc19kKG9wdGlvbiA9ICJEIiwgZGlyZWN0aW9uID0gLTEpICsgCiAgdGhlbWVfbWF0dCgpICsgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQpgYGAKCmBgYHtyIGN0bWF4LXJpZGdlcywgZmlnLndpZHRoPTgsIGZpZy5oZWlnaHQ9OH0KY3RtYXhfZGF0YSAlPiUgCiAgbXV0YXRlKGdyb3VwX2lkID0gcGFzdGUoc2l0ZSwgc3BlY2llcywgY29sbGVjdGlvbl9kYXRlKSkgJT4lIAogIGdncGxvdChhZXMoeCA9IGN0bWF4LCB5ID0gc2l0ZSwgZmlsbCA9IHNpdGUsIGdyb3VwID0gZ3JvdXBfaWQpKSArIAogIGdlb21fZGVuc2l0eV9yaWRnZXMoYmFuZHdpZHRoID0gMC4zLAogICAgICAgICAgICAgICAgICAgICAgaml0dGVyZWRfcG9pbnRzID0gVFJVRSwgCiAgICAgICAgICAgICAgICAgICAgICBwb2ludF9zaGFwZSA9IDIxLAogICAgICAgICAgICAgICAgICAgICAgcG9pbnRfc2l6ZSA9IDEsCiAgICAgICAgICAgICAgICAgICAgICBwb2ludF9jb2xvdXIgPSAiZ3JleTMwIiwKICAgICAgICAgICAgICAgICAgICAgIHBvaW50X2FscGhhID0gMC42LAogICAgICAgICAgICAgICAgICAgICAgYWxwaGEgPSAwLjksCiAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX3BvaW50c19qaXR0ZXIoCiAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCA9IDAuMSwgd2lkdGggPSAwKSkgKyAKICBzY2FsZV9maWxsX3ZpcmlkaXNfZChvcHRpb24gPSAiRCIsIGRpcmVjdGlvbiA9IC0xKSArIAogIGxhYnMoeCA9ICJDVG1heCAowrBDKSIpICsgCiAgdGhlbWVfbWF0dCgpICsgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQpgYGAKCiMjIEYzIERhdGEgCipTa2lzdG9kaWFwdG9tdXMgcGFsbGlkdXMqIHdhcyBjb2xsZWN0ZWQgZnJvbSB0aHJlZSBzaXRlcyAoQ2VudGVubmlhbCBQYXJrIC0gQ08sIE9jaHNuZXIgUG9uZCAtIE9ILCBhbmQgQ2VudGVyIFNwcmluZ3MgUG9uZCAtIENUKSB3ZXJlIHJlYXJlZCBpbiB0aGUgbGFiIGF0IDE2wrBDIGZvciBhdCBsZWFzdCB0aHJlZSBnZW5lcmF0aW9ucy4gQ1RtYXggd2FzIG1lYXN1cmVkIGZvciB0aGVzZSBjb3BlcG9kcyB0byB0ZXN0IGZvciBnZW5ldGljIHZhcmlhdGlvbiBpbiB0aGVybWFsIGxpbWl0cyBpbiB0aGlzIHdpZGVseSBkaXN0cmlidXRlZCBzcGVjaWVzLiAKCkxhYiByZWFyZWQgY29wZXBvZHMgdmFyaWVkIGluIHNpemUsIHdpdGggQ2VudGVubmlhbCBQYXJrIGluZGl2aWR1YWxzIH4wLjEgbW0gbG9uZ2VyIHRoYW4gdGhvc2UgZnJvbSBPY2hzbmVyIFBvbmQuIAoKYGBge3J9CmYzX2RhdGEgJT4lCiAgZ2dwbG90KGFlcyh4ID0gc2l0ZSwgeSA9IHNpemUpKSArIAogIGdlb21fYm94cGxvdCgpICsgCiAgZ2VvbV9wb2ludChwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcihoZWlnaHQgPSAwLCB3aWR0aCA9IDAuMSkpICsgCiAgbGFicyh4ID0gIlNpdGUiLCAKICAgICAgIHkgPSAiUHJvc29tZSBMZW5ndGggKG1tKSIpICsgCiAgdGhlbWVfbWF0dCgpCmBgYAoKYGBge3J9CmYzX3NpemUubW9kZWwgPSBsbWU0OjpsbWVyKGRhdGEgPSBmM19kYXRhLAogICAgICAgICAgICAgICAgICAgICAgc2l6ZSB+IHNpdGUgKyAoMSB8IGV4cGVyaW1lbnRfZGF0ZSkpCgojcGVyZm9ybWFuY2U6OmNoZWNrX21vZGVsKGYzX3NpemUubW9kZWwpCgpjYXI6OkFub3ZhKGYzX3NpemUubW9kZWwpCgpgYGAKClVwcGVyIHRoZXJtYWwgbGltaXQgZGlkIG5vdCB2YXJ5IGJldHdlZW4gdGhlIHBvcHVsYXRpb25zLiAKCmBgYHtyfQpmM19kYXRhICU+JQpnZ3Bsb3QoYWVzKHggPSBzaXRlLCB5ID0gY3RtYXgpKSArIAogIGdlb21fYm94cGxvdCgpICsgCiAgZ2VvbV9wb2ludChwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcihoZWlnaHQgPSAwLCB3aWR0aCA9IDAuMSkpICsgCiAgbGFicyh4ID0gIlNpdGUiLCAKICAgICAgIHkgPSAiQ1RtYXggKMKwQykiKSArIAogIHRoZW1lX21hdHQoKQpgYGAKCmBgYHtyfQoKZjNfY3RtYXgubW9kZWwgPSBsbWU0OjpsbWVyKGRhdGEgPSBmM19kYXRhLCAKICAgICAgICAgICAgICAgICAgICAgIGN0bWF4IH4gc2l0ZSArICgxfGV4cGVyaW1lbnRfZGF0ZSkgKyAoMXx0dWJlKSkKCiNwZXJmb3JtYW5jZTo6Y2hlY2tfbW9kZWwoZjNfY3RtYXgubW9kZWwpCgpjYXI6OkFub3ZhKGYzX2N0bWF4Lm1vZGVsKQoKYGBgCgpgYGB7cn0KZjNfZGF0YSAlPiUgCiAgZ3JvdXBfYnkoZXhwZXJpbWVudF9kYXRlLCBzaXRlKSAlPiUgCiAgc3VtbWFyaXNlKG1lYW5fY3RtYXggPSBtZWFuKGN0bWF4KSwgCiAgICAgICAgICAgIHNlX2N0bWF4ID0gc2QoY3RtYXgpIC8gc3FydChuKCkpKSAlPiUgCmdncGxvdChhZXMoZXhwZXJpbWVudF9kYXRlLCB5ID0gbWVhbl9jdG1heCwgY29sb3VyID0gc2l0ZSwgZ3JvdXAgPSBzaXRlKSkgKyAKICBnZW9tX3BvaW50KGRhdGEgPSBmM19kYXRhLAogICAgICAgICAgICAgYWVzKHggPSBleHBlcmltZW50X2RhdGUsIHkgPSBjdG1heCwgY29sb3VyID0gc2l0ZSksCiAgICAgICAgICAgICBzaXplID0gMSwgYWxwaGEgPSAwLjMsCiAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcmRvZGdlKGppdHRlci5oZWlnaHQgPSAwLCBqaXR0ZXIud2lkdGggPSAwLjA1LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9kZ2Uud2lkdGggPSAwLjMpKSArIAogICAgZ2VvbV9saW5lKGxpbmV3aWR0aCA9IDEuMywKICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC4zKSkgKyAKICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gbWVhbl9jdG1heCAtIHNlX2N0bWF4LCB5bWF4ID0gbWVhbl9jdG1heCArIHNlX2N0bWF4KSwKICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjMpLAogICAgICAgICAgICAgICAgd2lkdGggPSAwLjI1LCBsaW5ld2lkdGggPSAxKSArIAogICAgZ2VvbV9wb2ludChzaXplID0gMywKICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuMykpICsgCiAgbGFicyh4ID0gIkV4cGVyaW1lbnQgRGF0ZSIsIAogICAgICAgeSA9ICJDVG1heCAowrBDKSIpICsgCiAgdGhlbWVfbWF0dCgpICsgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInJpZ2h0IikKYGBgCgoKRmVjdW5kaXR5IGFsc28gYXBwZWFycyB0byB2YXJ5IGJldHdlZW4gcG9wdWxhdGlvbnMsIGV2ZW4gYWZ0ZXIgcmVhcmluZyBpbiBsYWIgZm9yIHNldmVyYWwgZ2VuZXJhdGlvbnMsIGFsdGhvdWdoIHRoaXMgZGlmZmVyZW5jZSBkb2VzIG5vdCBhcHBlYXIgdG8gYmUgc2lnbmlmaWNhbnQuIAoKYGBge3J9CgpnZ3Bsb3QoZjNfZGF0YSwgYWVzKHggPSBzaXRlLCB5ID0gZmVjdW5kaXR5KSkgKyAKICBnZW9tX2JveHBsb3QoKSArIAogIGdlb21fcG9pbnQocG9zaXRpb24gPSBwb3NpdGlvbl9qaXR0ZXIoaGVpZ2h0ID0gMCwgd2lkdGggPSAwLjEpKSArIAogIGxhYnMoeCA9ICJTaXRlIiwgCiAgICAgICB5ID0gIkNsdXRjaCBTaXplIChlZ2dzIHBlciBmZW1hbGUpIikgKyAKICB0aGVtZV9tYXR0KCkKCmBgYAoKYGBge3J9CgojIGYzX2ZlY3VuZC5tb2RlbCA9IGdsbShkYXRhID0gZjNfZGF0YSwgCiMgICAgICAgICAgICAgICAgICAgICAgIGZlY3VuZGl0eSB+IHNpdGUsCiMgICAgICAgICAgICAgICAgICAgICAgIGZhbWlseT0icG9pc3NvbiIpCgpmM19mZWN1bmQubW9kZWwgPSBsbWU0OjpnbG1lcihkYXRhID0gZjNfZGF0YSwgCiAgICAgICAgICAgICAgICAgICAgICBmZWN1bmRpdHkgfiBzaXRlICsgKDF8ZXhwZXJpbWVudF9kYXRlKSwKICAgICAgICAgICAgICAgICAgICAgIGZhbWlseT0icG9pc3NvbiIpCgojIHBlcmZvcm1hbmNlOjpjaGVja19tb2RlbChmM19mZWN1bmQubW9kZWwpCgpjYXI6OkFub3ZhKGYzX2ZlY3VuZC5tb2RlbCkKYGBgCgpXZSBhbHNvIGV4YW1pbmVkIGhvdyBveHlnZW4gY29uc3VtcHRpb24gcmF0ZXMgdmFyaWVkIGFjcm9zcyB0ZW1wZXJhdHVyZXMgZm9yIHRoZSB0d28gcG9wdWxhdGlvbnMuIFJlc3VsdHMgYXJlIHByZWxpbWluYXJ5LCBidXQgaXQgc2VlbXMgbGlrZSB0aGUgdHdvIHBvcHVsYXRpb25zIG1heSBoYXZlIHNpbWlsYXIgb3B0aW11bSB0ZW1wZXJhdHVyZXMuIAoKYGBge3J9CnRwY19yYXRlcyAlPiUgCiAgZmlsdGVyKHRlbXAgIT0gMzIpICU+JSAKICBmaWx0ZXIoISh0ZW1wID4gMTUgJiByc3EgPCAwLjcpKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gdGVtcCwgeSA9IHJhdGUsIGNvbG91ciA9IHRyZWF0bWVudCkpICsgCiAgI2ZhY2V0X3dyYXAodHJlYXRtZW50fi4sIG5yb3cgPSAyKSArIAogIGdlb21fcG9pbnQoKSArIAogIGdlb21fc21vb3RoKCkgKyAKICB0aGVtZV9idygpCmBgYAoKVG8gc3VtbWFyaXplIHRoZSBpbml0aWFsIGZpbmRpbmdzLCBDZW50ZW5uaWFsIFBhcmsgY29wZXBvZHMgaGFkIGxhcmdlciBib2R5IHNpemVzIGJ1dCBzbWFsbGVyIGNsdXRjaCBzaXplcyB0aGFuIGNvcGVwb2RzIGZyb20gT2Noc25lciBQb25kLiBDVG1heCBhbmQgdGhlcm1hbCBvcHRpbWEgd2VyZSBzaW1pbGFyIGJldHdlZW4gdGhlIHR3byBwb3B1bGF0aW9ucy4gCgojIyBIaWdoIHRocm91Z2hwdXQgc2l6ZSBtZWFzdXJlbWVudHMgCgpgYGB7cn0Kc2Nhbl9zaXplcyAlPiUgCiAgZmlsdGVyKHNleCA9PSAiZmVtYWxlIiwgc3RhZ2UgPT0gImFkdWx0IikgJT4lIAogIGdncGxvdChhZXMoeCA9IGxlbmd0aCwgZmlsbCA9IHNwZWNpZXMpKSArIAogIGZhY2V0X3dyYXAoc2l0ZX4uLCBucm93ID0gMykgKyAKICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDAuMDEsIGNvbG91ciA9ICJncmV5MTAiLCBsaW5ld2lkdGggPSAwLjI1KSArIAogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IHNraXN0b19jb2xzKSArIAogIHRoZW1lX21pbmltYWwoYmFzZV9zaXplID0gMjApICsgCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKQpgYGAKCmBgYHtyfQoKc2Nhbl9zaXplcyAlPiUgCiAgZmlsdGVyKHNleCA9PSAiZmVtYWxlIiwgc3RhZ2UgPT0gImFkdWx0IikgJT4lCiAgZ2dwbG90KGFlcyh4ID0gbGVuZ3RoLCB5ID0gc2l0ZSwgZmlsbCA9IHNwZWNpZXMpKSArIAogIGdlb21fZGVuc2l0eV9yaWRnZXMoYmFuZHdpZHRoID0gMC4wMiwKICAgICAgICAgICAgICAgICAgICAgIGppdHRlcmVkX3BvaW50cyA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX3BvaW50c19qaXR0ZXIoeW9mZnNldCA9IC0wLjE1LCB3aWR0aCA9IDAsIGhlaWdodCA9IDAuMSksCiAgICAgICAgICAgICAgICAgICAgICBwb2ludF9hbHBoYSA9IDAuMywgcG9pbnRfY29sb3VyID0gImdyZXkzMCIpICArIAogIGxhYnMoeSA9ICIiLAogICAgICAgeCA9ICJQcm9zb21lIExlbmd0aCAobW0pIikgKyAKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBza2lzdG9fY29scykgKyAKICB0aGVtZV9taW5pbWFsKGJhc2Vfc2l6ZSA9IDIwKSArIAogIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiKSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikKCmBgYAoKYGBge3J9CnNjYW5fc2l6ZXMgJT4lIAogIGZpbHRlcihzZXggPT0gImZlbWFsZSIsIHN0YWdlID09ICJhZHVsdCIpICU+JQogIGlubmVyX2pvaW4oc2l0ZV9kYXRhKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gY29sbGVjdGlvbl90ZW1wLCB5ID0gbGVuZ3RoKSkgKyAKICBnZW9tX3BvaW50KHBvc2l0aW9uID0gcG9zaXRpb25faml0dGVyKHdpZHRoID0gMC4wOCwgaGVpZ2h0ID0gMCkpICsgCiAgdGhlbWVfbWF0dCgpCmBgYAoKCiMjIENPSSBCYXJjb2RpbmcgCgpgYGB7ciwgZmlnLmFsaWduPSJjZW50ZXIifQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygiLi4vRmlndXJlcy9zcGVjaWVzX3Byb3BfcGxvdC5wbmciKQpgYGAKCmBgYHtyLCBmaWcuYWxpZ249ImNlbnRlciJ9CmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCIuLi9GaWd1cmVzL2NsYWRlX3Byb3BfcGxvdC5wbmciKQpgYGAKCmBgYHtyLCBmaWcuYWxpZ249ImNlbnRlciJ9CmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCIuLi9GaWd1cmVzL3RyZWVfcGxvdC5wbmciKQpgYGAK